import { BorderType } from "./borderType";
import { boxFilterUint8 } from "./boxFilterUint8";

/**
 * 盒式滤波选项
 */
export interface BoxFilterOptions {
  /** 滤波半径 */
  radius: number;
  /** 边界处理方式 */
  borderType?: BorderType;
}

/**
 * 对 ImageData 应用盒式滤波
 * 内部复用 boxFilterUint8 实现以保证性能一致性
 * @param imageData 输入的 ImageData 对象
 * @param options 滤波选项
 * @returns 滤波后的 ImageData 对象
 */
export function boxFilterImageData(
  imageData: ImageData,
  options: BoxFilterOptions,
): ImageData {
  const { radius, borderType = BorderType.REPLICATE } = options;

  if (radius < 0) {
    throw new Error("Radius must be non-negative");
  }

  if (radius === 0) {
    // 快速返回副本
    return new ImageData(
      new Uint8ClampedArray(imageData.data),
      imageData.width,
      imageData.height,
    );
  }

  // 复制原始数据以避免修改输入
  const dataCopy = new Uint8ClampedArray(imageData.data);

  // 复用 Uint8ClampedArray 的高性能实现
  let filteredData = boxFilterUint8(
    dataCopy,
    imageData.width,
    imageData.height,
    radius,
    borderType,
  );

  // 确保 filteredData 基于标准 ArrayBuffer
  let arrayBuffer: ArrayBuffer;
  if (filteredData.buffer instanceof SharedArrayBuffer) {
    // 转换 SharedArrayBuffer 到标准 ArrayBuffer
    const tempArray = new Uint8Array(filteredData);
    arrayBuffer = tempArray.buffer;
  } else {
    // 直接使用现有 buffer
    arrayBuffer = filteredData.buffer as ArrayBuffer;
  }

  // 使用明确基于 ArrayBuffer 的数据创建 ImageData
  const safeData = new Uint8ClampedArray(arrayBuffer);
  return new ImageData(safeData, imageData.width, imageData.height);
}
